/**
 * estatistica.h
 * Autores: Danilo S. Carvalho	- 107390588
 * 			Taísa L. Martins	- 107362828 
 *
 */

#ifndef estatistica_h
#define estatistica_h

#include <cstdio>


namespace SimuladorAD{
	
    /**
     * \brief A classe Amostra representa uma amostra das grandezas analisadas pelo simulador, obtidas
     * de um fregûes típico que passou pelo sistema e teve suas estatísticas coletadas.
     *
     * A classe guarda valores amostrados na simulação e valores temporários usados para cálculos. \n
     */    
    class Amostra {
	    
	    public:
	    
	    double T_quad; /**< Quadrado da amostra de T (tempo total). */
		double X_quad; /**< Quadrado da amostra de X (tempo de serviço). */
		double W_quad; /**< Quadrado da amostra de W (tempo de espera na fila). */
	    double N_quad; /**< Quadrado da amostra de N (número de fregueses no sistema). */
	    double Nq_quad; /**< Quadrado da amostra de Nq (número de fregueses na fila) */
	    double vW_quad; /**< Quadrado da amostra de vW (variância do tempo de espera na fila). */
	    
	    double T; /**< Amostra de T. */
		double X; /**< dAmostra de X. */
		double W; /**< Amostra de W. */
	    double N; /**< Amostra de N. */
	    double Nq; /**< Amostra de Nq. */
		double vW; /**< Amostra de vW. */
	    
	    double var_T; /**<  Variável temporária para variância de T. */
		double var_X; /**<  Variável temporária para variância de X. */
		double var_W; /**<  Variável temporária para variância de W. */
	    double var_N; /**<  Variável temporária para variância de N. */
	    double var_Nq; /**<  Variável temporária para variância de Nq. */
	    double var_vW; /**<  Variável temporária para variância de vW. */
	    
	     /**
	      * Construtor padrão para a classe Amostra; inicia todos os valores com 0.
	      */
	      Amostra();
	      
	      /**
	      * Limpa os valores.
	      */
	      void clear(void);
	      
	      /**
	      * Insere uma amostra, atribuindo os campos pertinentes.
          *
          * \param tempo_total Valor para T
          * \param numero_total_de_pessoas Valor para N
          * \param numero_total_de_pessoas Valor para N
          * \param numero_de_pessoas_em_espera Valor para Nq
          * \param tempo_espera Valor para W
	      */
	      void insere_amostra(double tempo_total, int numero_total_de_pessoas, int numero_de_pessoas_em_espera, double tempo_espera);
	};

	/**
    * \brief A classe ResultadosSimulacao reune os dados das duas filas do sistema.
    */
    class ResultadosSimulacao {

		public:
		
		double quantidade; /**< Quantidade de amostras realizadas */
		
        Amostra fila[2]; /**< Dados das filas 1 e 2 */
        
        /**
	    * Limpa os resultados.
	    */
		void clear (void);
		
		/**
		 * Calcula as estatísticas para este conjunto de resultados.
		 */
		void calculaEstatisticas(void);
		
		/** Operador para soma de dois conjuntos de resultados */
		void operator+=(ResultadosSimulacao op2);
	};

}

#endif //estatistica.h
